// RFC3550 6.7 APP: Application-Defined RTCP Packet

#include "rtp-internal.h"
#include "rtp-util.h"

void rtcp_app_unpack(struct rtp_context *ctx, const rtcp_header_t *header, const uint8_t *ptr, size_t bytes)
{
    struct rtcp_msg_t msg;
    // struct rtp_member *member;

    if (bytes < 8) // RTCP header + SSRC + name
    {
        assert(0);
        return;
    }

    msg.ssrc = nbo_r32(ptr);
    msg.type = RTCP_APP;

    // member = rtp_member_fetch(ctx, msg.ssrc);
    // if(!member) return; // error

    msg.u.app.subtype = header->rc;
    memcpy(msg.u.app.name, ptr + 4, 4);
    msg.u.app.data = (void *)(ptr + 8);
    msg.u.app.bytes = (int)bytes - 8;

    ctx->handler.on_rtcp(ctx->cbparam, &msg);
}

int rtcp_app_pack(struct rtp_context *ctx, uint8_t *ptr, int bytes, const char name[4], const void *app, int len)
{
    rtcp_header_t header;

    if (bytes >= 12 + (len + 3) / 4 * 4) {
        header.v = 2;
        header.p = 0;
        header.pt = RTCP_APP;
        header.rc = 0;
        header.length = (uint16_t)(2 + (len + 3) / 4);
        nbo_write_rtcp_header(ptr, &header);

        nbo_w32(ptr + 4, ctx->self->ssrc);
        memcpy(ptr + 8, name, 4);

        if (len > 0) {
            memcpy(ptr + 12, app, len);
            if (0 != len % 4)
                memset(ptr + 12 + len, 0, 4 - (len % 4));
        }
    }

    return 12 + (len + 3) / 4 * 4;
}
